package com.cskaoyan.javase.oop1._13pop;

/**
 * @description: 面向对象实现把大象装进冰箱
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 把大象装进冰箱
 * 对象: 大象和冰箱
 * 定义
 * 大象类和冰箱类即可
 *
 * 面向对象程序的优缺点:
 * 优点:
 *  1.面向对象思想的程序不再是以方法为基础,而是以对象为基础,按照功能划分相应的模块,
 *  每个模块之间虽然有联系有交互,但是联系不会像面向过程那么紧密
 *  所以面向对象思想编写的程序,程序的可维护性和扩展性都会更好(有这个优点就够了)
 *
 *  2.划分模块以后,不同模块之间相对独立,不同模块交给不同的程序员,程序员不需要熟悉整个系统的所有流程,只需要专心负责完成自己的部分就够了,有利于分工合作,完成大型的项目开发
 *
 *  缺点:
 *       1.不够直接,花里胡哨,会导致程序变得臃肿,并且面向对象的程序会需要设计架构,事先分模块,分工合作,导致开发的周期会相对较长.如果只是一个简单的需求,使用面向对象去实现完全是画蛇添足
 *       2.面向对象需要管理庞大的对象体系,所以往往效率不高,并且对运行的机器要求比较高(服务器都很高)
 *
 * 综上，面向对象思想编程主要应用于大型的企业级商业软件的开发，而对于小项目，小需求，使用面向对象思想就有点不必要了
 * 面向对象和面向过程思想不是根据编程语言划分的，它们都是编程的思想
 * 比如C语言是面向过程的语言，操作系统内核OS多数都是C语言代码写的，可以说它们是用面向过程语言去写的
 *  但是从编程思想上来说，操作系统内核仍然是具有面向对象思想的程序
 *
 * 面向对象思想就是为解决程序的扩展性和可维护性的问题
 *
 */
public class Demo2 {
    public static void main(String[] args) {
        Elephant e = new Elephant();
        Fridge f = new Fridge();
        e.fridge = f;

        e.goToFridge();
        f.open();
        e.goToFridge();
        f.close();
    }
}

//大象类
class Elephant {
    //大象可以和冰箱交互,持有引用
    Fridge fridge;

    //走进冰箱
    public void goToFridge() {
        if (fridge.flag) System.out.println("门开了我进去了!");
        else System.out.println("快开门,我要进去!");
    }
}

//冰箱类
class Fridge {
    //需要一个指示冰箱门状态的成员变量
    //false表示门关着,true表示开着门
    boolean flag = false;

    //开门
    public void open() {
        flag = true;
    }

    //关门
    public void close() {
        flag = false;
    }
}